﻿using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace WindowsAPI.DWM
{
    /// <summary>Основные функции для интеграции программы с DWM</summary>
    public class DwmApi
    {
        public const string FileName = "dwmapi.dll";

        /* ------------------------------------------------------------------------------------------ */

        public static int OsVersion { get { return Environment.OSVersion.Version.Major; } }

        public static bool IsDwmCompitable { get { return OsVersion >= 6; } }

        /* ------------------------------------------------------------------------------------------ */

        /// <summary>Получение состояния DWM со включенной компоновкой рабочего стола</summary>
        /// <remarks>
        /// включение и отключение компоновки DWM. DWM сохраняет этот параметр до завершения текущего процесса или до его сброса. 
        /// Изменение параметра вызывает уведомление WM_DWMCOMPOSITIONCHANGED. 
        /// Большинству приложений не требуется вызывать эту функцию, но скорее всего вам потребуется проследить результирующее сообщение Windows.
        /// </remarks>
        /// <param name="Enable">Состояние</param>
        [DllImport(FileName, PreserveSig = false)]
        public static extern void DwmEnableComposition(bool Enable);

        [DllImport(FileName, PreserveSig = false)]
        public static extern void DwmEnableBlurBehindWindow(IntPtr hWnd, BlurBehind BlurBehind);

        [DllImport(FileName, PreserveSig = false)]
        public static extern void DwmExtendFrameIntoClientArea(IntPtr hWnd, Margins Margins);

        [DllImport(FileName, PreserveSig = false)]
        public static extern bool DwmIsCompositionEnabled();

        /// <summary>
        /// Получение текущего цвета, использующегося для компоновки стекла DWM. 
        /// Это значение основано на текущей цветовой схеме. 
        /// Изменение этого параметра вызывает уведомление WM_WMCOLORIZATIONCOLORCHANGED
        /// </summary>
        /// <param name="Colorization"></param>
        /// <param name="OpaqueBlend"></param>
        [DllImport(FileName, PreserveSig = false)]
        public static extern void DwmGetColorizationColor(out int Colorization,
            [MarshalAs(UnmanagedType.Bool)]out bool OpaqueBlend);

        /// <summary>
        /// Создает отношения эскиза между исходным окном и окном назначения
        /// </summary>
        /// <param name="DestinationHandle"></param>
        /// <param name="SourceHandle"></param>
        /// <returns></returns>
        [DllImport(FileName, PreserveSig = false)]
        public static extern IntPtr DwmRegisterThumbnail(IntPtr DestinationHandle, IntPtr SourceHandle);

        /// <summary>Удаляет отношение эскиза DWM, созданное функцией</summary>
        /// <param name="ThumbnailHandle"></param>
        [DllImport(FileName, PreserveSig = false)]
        public static extern void DwmUnregisterThumbnail(IntPtr ThumbnailHandle);

        /// <summary>Обновляет свойства определенного эскиза</summary>
        /// <param name="ThumbnailHandle"></param>
        /// <param name="Properties"></param>
        [DllImport(FileName, PreserveSig = false)]
        public static extern void DwmUpdateThumbnailProperties(IntPtr ThumbnailHandle, ThumbnailProperties Properties);

        [DllImport(FileName, PreserveSig = false)]
        public static extern void DwmQueryThumbnailSourceSize(IntPtr ThumbnailHandle, out Size size);
    }
}
